<?php
namespace hbynlsl\spf;

use hbynlsl\spf\ResourceModel;

/**
 * 资源方法抽象类
 */
class Resource {
    
    // 数据表操作对象
    protected $db = null;
    // 请求参数
    protected $request = null;
    // 中间件
    protected $middleware = [
        'cors',
        // 'accesstoken'
    ];

    // 构造方法，初始化数据表操作对象
    public function __construct() {
        // 获取类名
        $classname = (new \ReflectionClass(get_class($this)))->getShortName();
        // 获取数据表模型类名称
        $modelClassName = 'app\models\\' . ucfirst($classname);
        // 创建数据表操作对象
        $this->db = new $modelClassName;
        // 请求对象
        $this->request = request();
    }

  
    /**
     * 执行restful-api请求
     * @param string $resource 数据表名称
     * @param integer $id 主键字段值 
     */
    public static function handleRestapi(string $resource, $id) {
        // 获取请求参数
        $request = request();
        // 处理 restful api 请求
        switch ($request->getMethod()) {
            case 'get':
                // 获取with-tables
                $with = input('with', '');
                if ($id > 0) {  // 单条记录（主键id）
                    $res = ResourceModel::find($resource, $id, $with);
                } else {    // 多条数据
                    // 获取请求参数
                    $where = input('where', '');
                    $fields = input('fields', '*');
                    $order = input('orderby', '');
                    // 获取分页数据
                    $page = input('page', 0);
                    if ($page > 0) {    // 获取分页数据
                        $res = ResourceModel::paginate($resource, $page, $where, $with, $fields, $order, input('pagesize', 10));
                    } else {    // 获取所有数据
                        $res = ResourceModel::select($resource, $where, $with, $fields, $order);
                    }
                }
                return restJson($res['status'], $res['datas'], $res['amount']);
            case 'post':
                // 创建并保存资源
                $postdata = input()->all();
                unset($postdata['resource']);
                $model = ResourceModel::getResourceHandler($resource);
                if ($row = $model::create($postdata)) {
                    return restJson('10003', $model::find($row->id));
                }
                return restJson('50007');
            case 'put':
            case 'patch':
                if (!$id) {
                    return restJson('50008');
                }
                // 更新资源
                $putdata = input()->all();
                unset($putdata['resource']);
                $model = ResourceModel::getResourceHandler($resource);
                if (false !== $model::where('id', $id)->update($putdata)) {
                    return restJson('10004', $model::find($id));
                }
                return restJson('50009');
            case 'delete':
                if (!$id) {
                    return restJson('50010');
                }
                // 删除资源
                $model = ResourceModel::getResourceHandler($resource);
                if ($model::destroy($id)) {
                    return restJson('10005');
                }
                return restJson('50011');
            default:
                // 未匹配的请求方法
                return restJson('50002');
        }
    }
}
